module.exports = {
  /**
   * 在model文件中使用，定义必填项
   * @param {string} tipName
   * @returns
   */
  isRequired: (tipName) => {
    return {
      notNull: {
        msg: `${tipName}不能为空`,
      },
      notEmpty: {
        msg: `${tipName}不能是空字符串`,
      },
    };
  },

  /**
   *  合并编辑数据
   * @param {sequelizeData} sqlItem 数据库查询到的数据
   * @param {object} body 传递的请求体
   * @param {string[]} unAssignField 不赋值字段
   */
  assignEditValue: (sqlItem, body, unAssignField = []) => {
    for (let key of Object.keys(sqlItem.dataValues)) {
      if (unAssignField.includes(key)) continue;
      sqlItem[key] = body[key];
    }
  },

  /**
   * 将数组转换为树形结构
   * @param {any[]} data  数据列表
   * @param {object} props  id和parentId字段名
   * @returns
   */
  arrToTree(
    data,
    props = { id: "id", parentId: "parentId", unRenderFields: ["buttons"] }
  ) {
    const result = [];
    const map = new Map();
    data.forEach((item) => {
      const { unRenderFields } = props;
      // 去除不渲染的数据
      unRenderFields?.forEach((fields) => {
        delete item[fields];
      });
      // 存入字典集里
      map.set(item[props.id], item);
    });

    data.forEach((item) => {
      // 判断字典集里是否有该键
      const parent = map.get(item[props.parentId]);
      if (parent) {
        (parent?.children ?? (parent.children = [])).push(item);
      } else {
        result.push(item);
      }
    });
    return result;
  },

  /**
   * 通过递归获取当前id下的所有子集id
   * @param {string[]} allIdList  全量数据id列表
   * @param {string} id 当前id
   * @param {string[]} treeIdList  获取到的子集id
   * @param {object} props id和parentId字段名
   * @returns
   */
  async getAllTreeIdByRecursion(
    allIdList,
    id,
    treeIdList = [],
    props = { id: "id", parentId: "parentId" }
  ) {
    const childList = allIdList.filter(
      ({ dataValues: item }) => item[props.parentId] === id
    );
    if (childList.length > 0) {
      childList.forEach(async ({ dataValues: item }) => {
        treeIdList.push(item[props.id]);
        await this.getAllTreeIdByRecursion(
          allIdList,
          item[props.id],
          treeIdList,
          props
        );
      });
    }
    return treeIdList;
  },

  /**
   * 通过id数组获取当前菜单及其所有父级菜单
   * @param {string[]} ids id数组
   * @param {any[]} list 全量数据列表
   * @param {object} props id和parentId字段名
   */
  getAllParentsByIds(ids, list, props = { id: "id", parentId: "parentId" }) {
    const result = [];
    const seen = new Set();

    function findParents(id) {
      if (seen.has(id)) {
        return;
      }

      const item = list.find((m) => m[props.id] === id);
      if (item) {
        if (item[props.parentId]) {
          findParents(item[props.parentId]);
        }
        result.push(item);
        seen.add(id);
      }
    }

    ids.forEach((id) => {
      findParents(id);
    });

    return result;
  },
};
